/**
 * LeetCode3：无重复字符的最长子串
 * 给定一个字符串，找出其中不含有重复字符的最长子串的长度
 */

/**
 *
 * @param {String} s
 * @return {number}
 * @description 用两个指针形成滑动窗口，右指针向右移动，添加新的字符串
 * @description 如果滑动窗口内出现重复的字符串，就将左指针移动到第一次出现的字符的右侧
 */
var lengthOfLongestString = function(s){
    let l = 0;//左指针初始位置
    let res = 0;//子串最大长度
    const map = new Map();
    for (let r = 0; r < s.length; r += 1){
        //如果map中存在当前字符，且当前字符的下标大于左指针位置
        //说明是重复的字符，将左指针放在原字符的下一个字符处
        if (map.has(s[r]) && map.get(s[r]) > l){
            l = map.get(s[r]) + 1;
        }
        res = Math.max(res,r-l+1);
        //将当前字符和下标放在map中
        map.set(s[r],r);
    }
    return res;
}

//时间复杂度：O(n)
//空间复杂度：O(m)